import pandas as pd
import warnings
import os
from styleframe import StyleFrame

from data_processing.decompression import csv_file_name


class DataProcessing:
    @staticmethod
    # 数据处理，将csv文件转换为list数据类型
    def data_import(address):
        warnings.filterwarnings('ignore')
        # 使用pd的read_csv方法读取csv文件
        ex_data = pd.read_excel(address)
        # 使用columns方法获取标题行数据
        head_list = list(ex_data.columns)
        list_dic = []
        # 获取标题行的每一个值，进行数据处理
        for i in ex_data.values:
            # 将球员数据和标题行合并成一个字典
            a_line = dict(zip(head_list, i))
            # 将字典存入列表中
            list_dic.append(a_line)
        return list_dic

    @staticmethod
    # 对处理好的数据进行合并导出
    def merge_export(table_score, head_list, score_file, determine=True):
        warnings.filterwarnings('ignore')
        # 将list转换成dataframe格式
        data = pd.DataFrame.from_dict(table_score)
        # 将重复的数据进行合并求和
        if determine:
            data.groupby(head_list[0])[head_list[2:]].sum()
        # 指定表头进行求平均值
        data['wPA'] = data[head_list[3:-3]].mean(axis=1)
        # 指定表头进行排序
        df = data.sort_values(by="Integral", ascending=False)
        if determine:
            # 对不需要的数据进行删除
            df.drop(columns=head_list[3:-3], inplace=True)
        else:
            df['wPA'] = list(map(lambda x, y: x / y, df['wPA'], data['games played']))
        # 导出xlsx文件
        print(df)
        StyleFrame(df).round(1).to_excel(score_file, float_format='%.1f', index=False)
        return score_file

    # 对积分数据进行合并导出
    @staticmethod
    def merge(integral_data, sort_name, file):
        warnings.filterwarnings('ignore')
        # 读取总的表格
        file_data = pd.read_excel(file)
        # 将获取的数据转成dataframe格式
        data = pd.DataFrame.from_dict(integral_data)
        # 合并数据
        df = pd.concat([data, file_data])
        df_sum = df.groupby('Players Name').sum()
        # 对数据进行排序
        df_sum.sort_values(by=sort_name, ascending=False, inplace=True)
        # 导出
        os.remove(file)
        df_sum.to_excel(file)

    @staticmethod
    def weight_merge(file_list, sort_name='Integral', file=r'D:\pyitem\soccer\data\score_data.xlsx'):
        warnings.filterwarnings('ignore')
        l = list()
        for f in file_list:
            ls = pd.read_excel(f)
            l.append(ls)
        data = pd.read_excel(file)
        l.append(data)
        # 合并数据
        df = pd.concat(l)
        df_sum = df.groupby('Players Name').sum()
        # 对数据进行排序
        df_sum.sort_values(by=sort_name, ascending=False, inplace=True)
        l.clear()
        # 导出
        os.remove(file)
        df_sum.to_excel(file, float_format='%.2f', index=False)

    # 对合并好的数据进行除以场次的操作
    @staticmethod
    def divide_by_session(data=r'D:\pyitem\soccer\data\score_data.xlsx', file=r'D:\pyitem\soccer\data\table.xlsx'):
        # 获取合并好的数据
        data = pd.read_excel(data)
        # 对合并好的权重值进行除以场次的操作
        data['wPA'] = list(map(lambda x, y: x / y, data['wPA'], data['games played']))
        # 导出
        os.remove(file)
        data.to_excel(file, float_format='%.2f', index=False)

    @staticmethod
    def get_file_path_by_name(file_dir, name):
        """
        获取指定路径下所有文件的绝对路径
        :param file_dir:
        :return:
        """
        L = []
        # 获取所有文件
        for root, dirs, files in os.walk(file_dir):
            # 遍历所有文件名
            for file in files:
                print(file[:4])
                if file[:4] in name:
                    # 拼接处绝对路径并放入列表
                    L.append(os.path.join(root, file))
        return L


if __name__ == "__main__":
    a = ['1002', '1003', '1004', '1005', '1006', '1007', '1008', '1010', '1011']
    file_list = DataProcessing().get_file_path_by_name(r'D:\pyitem\soccer\data\score', a)
    DataProcessing().weight_merge(file_list)
    DataProcessing().divide_by_session()

    # csv_list = csv_file_name("D:\pyitem\soccer\data\\1003\\")
    # for a in csv_list:
    #     list_dic, head_list = DataProcessing().data_import("D:\pyitem\soccer\data\\1003\\" + a)
    #     print(head_list)

    # DataProcessing().merge_export(l, h, "D:\pyitem\soccer\data\\1002score.xlsx", '1002')
